/*
 * @file_name: uri_impl.hpp
 * @date: 2021/12/06
 * @author: oaho
 * Copyright @ hz oaho, All rights reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
#ifndef HTTP_URI_IMPL_HPP
#define HTTP_URI_IMPL_HPP
#include <string>
#include <http/impl/detail/uri_impl.ipp>
namespace http{
  uri::uri():impl(nullptr){
      impl = new detail::impl;
  }

  uri::uri(const std::string& url){
      impl = new detail::impl(url);
  }

  uri::uri(const char* url){
    impl = new detail::impl(url);
  }

  uri::uri(const uri& url){
    impl = new detail::impl(*url.impl);
  }

  uri::uri(uri&& _uri){
    impl = new detail::impl(std::move(*_uri.impl));
  }

  uri::~uri(){
    if(impl)delete impl;
  }

  uri& uri::operator=(const uri& _other){
    (*impl) = impl-> operator = (*_other.impl);
    return *this;
  }

  const char* uri::schema() const{
    return "http";
  }

  const std::string& uri::host() const{
    return impl->host();
  }

  void uri::host(const std::string& _host){
    return impl->host(_host);
  }

  template<size_t N> void uri::host(const char (&arr)[N - 1]){
    return impl->host(arr, N - 1);
  }

  const unsigned short uri::port() const{
    return impl->port();
  }

  const std::string& uri::path() const{
    return impl->path();
  }

  void uri::path(const std::string& _path){
    return impl->path(_path);
  }

  template<size_t N> void uri::path(const char (&arr)[N - 1]){
    return impl->path(arr, N - 1);
  }

  const std::string& uri::get_parameter(const std::string& param) const{
    return impl->get_parameter(param);
  }

  template<typename T> void uri::set_parameter(const std::string& key, T&& v){
    return impl->set_parameter(key, std::forward<T>(v));
  }
};
#endif // VIDEO_ON_DEMAND_URI_IMPL_HPP
